package com.tobby.camel.camelinaction.chapter6.error;

import java.io.IOException;
import java.net.ConnectException;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class SimulateErrorUsingProcessorTest extends CamelTestSupport {

	@Override
	protected RouteBuilder createRouteBuilder() {
		return new RouteBuilder() {

			@Override
			public void configure() throws Exception {
				context.setTracing(true);
				errorHandler(defaultErrorHandler().maximumRedeliveries(5)
						.redeliveryDelay(1000));
				onException(IOException.class).maximumRedeliveries(3).handled(true)
						.to("mock:ftp");
				from("direct:file")
						// simulate an error using a processor to throw the Exception
						.process(new Processor() {
							@Override
							public void process(Exchange exchange) throws Exception {
								throw new ConnectException("Simulated connection error");
							}
						}).to("mock:http");
			}
		};
	}

	@Test
	public void testSimulateConnectionError() throws Exception {
		getMockEndpoint("mock:http").expectedMessageCount(0);

		MockEndpoint ftp = getMockEndpoint("mock:ftp");
		ftp.expectedBodiesReceived("Camel rocks");

		template.sendBody("direct:file", "Camel rocks");
		assertMockEndpointsSatisfied();
	}

}
